﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NUnit.Framework;
using Helpers;
using Capa_Dominio; 
using Capa_Persistencia_NH;
using Capa_Persistencia_NH.Interface;
using Capa_Persistencia_NH.AccesoDatos;

namespace Capa_TestingProyects
{
    [TestFixture]
    public class Test_SalaEnsayo
    {
        private ISalaEnsayo adminSalaEnsayo = null;
        int codigoGenerado = 0;
        Distrito objDistrito;
        Local objLocal;

        [TestFixtureSetUp]
        public void PrepararPruebas()
        {
            DistritoDAO adminDistrito;
            LocalDAO adminLocal;

            adminDistrito = new DistritoDAO();
            adminSalaEnsayo =  new SalaEnsayoDAO();
            adminLocal = new LocalDAO();

            //foreach (SalaEnsayo SalaEnsayo in adminSalaEnsayo.ListarTodos())
            //    adminSalaEnsayo.Eliminar(SalaEnsayo);

            objDistrito = adminDistrito.Obtener(1);
            objLocal = adminLocal.Crear(new Local() { NombreLocal = "Lince", Distrito = objDistrito, Direccion = "Av. Primavera 123", Estado = true });
        }

        [Test]
        public void Test1_Crear()
        {
            Assert.IsNotNull(adminSalaEnsayo);
            //se instancia a la entidad a crear
            SalaEnsayo objSalaEnsayo = new SalaEnsayo();
            objSalaEnsayo.NombreSala = "Sala Alquier #2";
            objSalaEnsayo.Local = objLocal;
            objSalaEnsayo.Capacidad = 6;
            objSalaEnsayo.Caracteristicas = "Sala para 6 personas";
            objSalaEnsayo.Disponibilidad = true;
            objSalaEnsayo.Comentarios = "Sala para 6 personas";
            objSalaEnsayo.Estado = true;
            //se declara la entidad que se retornara
            SalaEnsayo SalaEnsayoRetornado = null;
            //no aseguramos que no retorne una exepcion
            //Assert.DoesNotThrow(delegate
            //{
                SalaEnsayoRetornado = adminSalaEnsayo.Crear(objSalaEnsayo);
                codigoGenerado = SalaEnsayoRetornado.CodigoSala;
            //},"SalaEnsayo Generado");
            // Probamos que la entidad resultante no sea nula
            Assert.IsNotNull(SalaEnsayoRetornado);
            //verificamos que el codigo generado sera mayor que 0
            Assert.Greater(codigoGenerado, 0);
        }
        [Test]
        public void Test2_Modificar()
        {
            // 1. Clase a probar: SalaEnsayoDAO
            Assert.IsNotNull(adminSalaEnsayo);
            // 2. Declaramos e instanciamos la entidad de dominio
            SalaEnsayo SalaEnsayoAModificar = adminSalaEnsayo.Obtener(codigoGenerado);
            SalaEnsayoAModificar.NombreSala = "Sala Alquier #2";
            SalaEnsayoAModificar.Local = objLocal;
            SalaEnsayoAModificar.Capacidad = 6;
            SalaEnsayoAModificar.Caracteristicas = "Sala para 6 personas";
            SalaEnsayoAModificar.Disponibilidad = true;
            SalaEnsayoAModificar.Comentarios = "Sala para 6 personas";
            SalaEnsayoAModificar.Estado = true;
            // 3. Declaramos la entidad que contendrá el resultado
            SalaEnsayo SalaEnsayoModificado = null;
            // 4. Probamos que no ocurra error al ejecutar el método
            //Assert.DoesNotThrow(delegate
            //{
                // 5. Ejecutamos el método a probar
                SalaEnsayoModificado = adminSalaEnsayo.Modificar(SalaEnsayoAModificar);
            //}, "SalaEnsayo modificado");
            // Probamos que la entidad resultante no sea nula
            Assert.IsNotNull(SalaEnsayoModificado);
            // Probamos que el código generado sea mayor a 0
            Assert.AreEqual(SalaEnsayoModificado.CodigoSala, codigoGenerado);
            // Probamos que el nombre registrado es igual al solicitado con la entidad
            Assert.AreEqual(SalaEnsayoModificado.NombreSala, SalaEnsayoAModificar.NombreSala);
            // Probamos que la dirección registrada es igual a la solicitada con la entidad
            Assert.AreEqual(SalaEnsayoModificado.Local, SalaEnsayoAModificar.Local);
            Assert.AreEqual(SalaEnsayoModificado.Capacidad, SalaEnsayoAModificar.Capacidad);
            Assert.AreEqual(SalaEnsayoModificado.Caracteristicas, SalaEnsayoAModificar.Caracteristicas);
            Assert.AreEqual(SalaEnsayoModificado.Disponibilidad, SalaEnsayoAModificar.Disponibilidad);
            Assert.AreEqual(SalaEnsayoModificado.Comentarios, SalaEnsayoAModificar.Comentarios);
            Assert.AreEqual(SalaEnsayoModificado.Estado, SalaEnsayoAModificar.Estado);
        }

        [Test]
        public void Test3_Eliminar()
        {
            // 1. Clase a probar: SalaEnsayoDAO
            Assert.IsNotNull(adminSalaEnsayo);
            // 2. Definimos la entidad que contendrá el resultado
            SalaEnsayo SalaEnsayoExistente = adminSalaEnsayo.Obtener(codigoGenerado);
            // 3. Probamos que no ocurra error al ejecutar el método
            Assert.DoesNotThrow(delegate
            {
                // 5. Ejecutamos el método a probar
                adminSalaEnsayo.Eliminar(SalaEnsayoExistente);
            });
            // Probamos que la entidad ya no existe
            Assert.IsNull(adminSalaEnsayo.Obtener(codigoGenerado));
        }

        [Test]
        public void Test4_ListarTodos()
        {
            // 1. Clase a probar: LocalDAO
            Assert.IsNotNull(adminSalaEnsayo);
            // Declaramos la entidad que contendrá el resultado
            ICollection<SalaEnsayo> SalaEnsayoEncontrados = null;
            //  Probamos que no ocurra error al ejecutar el método
            Assert.DoesNotThrow(delegate
            {
                //  Ejecutamos el método a probar
                SalaEnsayoEncontrados = adminSalaEnsayo.ListarTodos();
            });
            // Probamos que la entidad resultante no sea nula
            Assert.IsNotNull(SalaEnsayoEncontrados);
        }

        [TestFixtureTearDown]
        public void TerminarPruebas()
        {
            NHibernateHelper.CerrarFabrica();
        }
    }
}
